package webServicesParser;

import javax.xml.rpc.Call;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.*;
import javax.xml.parsers.*; 
import java.io.*;
import model.social.*;
import model.librairie.*;

import javax.xml.namespace.QName;
import org.apache.axis.client.Service;
import java.util.*;

public class RecupObjet {

	static Service webService = new Service();
	static String url = "http://130.79.81.48/services/webAcrobatt"; 
	static File file = new File("ressources/other/SAX.xml");

	static int id = 0;
	static Utilisateur util = null;
	static Profil profil = null;
	static Editeur editeur = null;
	static Categorie categorie = null;
	static Set<model.librairie.Collection> listCollection = new HashSet<model.librairie.Collection>();
	static Set<BD> listBD = new HashSet<BD>();
	static Set<ParaBD> listParaBD = new HashSet<ParaBD>();
	static Set<Artiste> listArtiste = new HashSet<Artiste>();
	static Set<Genre> listGenre = new HashSet<Genre>();	
	
	public RecupObjet(){}
	
	public int getId(String login, String mdp) throws Exception{
		Call appel = webService.createCall();
		appel.setTargetEndpointAddress(url);
		appel.setOperationName(new QName("webAcrobatt", "exist"));
		Object res = appel.invoke(new Object[] {login,mdp});
		return Integer.parseInt(""+res);
	}
	
	public void setUtilisateur(Utilisateur util){			
		RecupObjet.util = util;
	}
	
	public static Utilisateur getUtilisateur(int id) throws Exception{
		getInfo(id,"getXMLUtilisateur");
		return util;
	}
	
	public void setEditeur(Editeur editeur){			
		RecupObjet.editeur = editeur;
	}
	
	public static Editeur getEditeur(int id, int idCollection, int idArt) throws Exception{
		getInfo(id,"getXMLEditeur",idCollection, idArt);
		return editeur;
	}
	
	public void setCategorie(Categorie categorie){			
		RecupObjet.categorie = categorie;
	}
	
	public static Categorie getCategorie(int id, int idCollection, int idArt) throws Exception{
		getInfo(id,"getXMLCategorie",idCollection, idArt);
		return categorie;
	}
	
	public void setProfil(Profil profil){			
		RecupObjet.profil = profil;
	}
	
	public static Profil getProfil(int id) throws Exception{
		getInfo(id,"getXMLProfil");
		return profil;
	}
	
	public static Set<model.librairie.Collection> getCollectionList(int id) throws Exception{
		getInfo(id,"getXMLCollection");
		return listCollection;
	}
	
	public void setBDList(Set<BD> list){			
		RecupObjet.listBD = list;
	}
	
	public static Set<BD> getBDList(int id, int idCollection) throws Exception{
		getInfo(id,"getXMLBD",idCollection);
		
		for(BD bd : listBD){
			System.out.println("bd Rcupe Objet : "+bd.getNom());
		}
		
		return listBD;
	}
	
	public void setParaBDList(Set<ParaBD> list){			
		RecupObjet.listParaBD = list;
	}
	
	public static Set<ParaBD> getParaBDList(int id, int idCollection) throws Exception{
		getInfo(id,"getXMLParaBD",idCollection);
		return listParaBD;
	}
	
	public void setCollectionList(Set<model.librairie.Collection> list){			
		RecupObjet.listCollection = list;
	}
	
	public void setArtisteList(Set<Artiste> list){			
		RecupObjet.listArtiste = list;
	}
	
	public static Set<Artiste> getArtisteList(int id, int idCollection, int idArt) throws Exception{
		getInfo(id,"getXMLArtiste",idCollection, idArt);
		return listArtiste;
	}
	
	public void setGenreList(Set<Genre> list){			
		RecupObjet.listGenre = list;
	}
	
	public static Set<Genre> getGenreList(int id, int idCollection, int idArt) throws Exception{
		getInfo(id,"getXMLGenre",idCollection, idArt);
		return listGenre;
	}
	
	public static void getInfo(int id,String methode) throws Exception{
		getInfo(id,methode,-1, -1);
	}
	
	public static void getInfo(int id,String methode, int idcollection) throws Exception{
		getInfo(id,methode,idcollection,-1);
	}
	
	public static void getInfo(int id, String methode, int idCollection, int idArticle) throws Exception,SAXException{
		try{
			
			Call appel = webService.createCall();
			appel.setTargetEndpointAddress(url);
			DefaultHandler gestionnaire = null;
			String xml="";
			
			appel.setOperationName(new QName("webAcrobatt", methode));
			
			if(methode.equals("getXMLBD") || methode.equals("getXMLParaBD"))
				xml = (String) appel.invoke(new Object[] {id,idCollection});
			else if(methode.equals("getXMLArtiste") || methode.equals("getXMLGenre") || methode.equals("getXMLEditeur") || methode.equals("getXMLCategorie"))
				xml= (String) appel.invoke(new Object[] {id,idCollection, idArticle});
			else
				xml = (String) appel.invoke(new Object[] {""+id});
			
			//creation d'un fichier contenant l'xml a parser		
			if(!file.exists()){
				file.createNewFile();
				System.out.println("creation d'un nouveau fichier");
			}
			
			FileWriter fw = new FileWriter(file, false);
			BufferedWriter output = new BufferedWriter(fw);
			output.write(xml);
			output.close();

			try{
				SAXParserFactory fabrique = SAXParserFactory.newInstance();
				org.xml.sax.InputSource input = new InputSource(xml);
				SAXParser parseur = fabrique.newSAXParser();
				
				//File fichier = new File("./ExempleSAX.xml");
				if(methode.equals("getXMLUtilisateur")){
					gestionnaire = new UtilisateurHandler();
				}else if(methode.equals("getXMLProfil")){
					gestionnaire = new ProfilHandler();
				}else if(methode.equals("getXMLCollection")){
					gestionnaire = new CollectionHandler();
				}else if(methode.equals("getXMLBD")){
					gestionnaire = new BDHandler();
				}else if(methode.equals("getXMLParaBD")){
					gestionnaire = new ParaBDHandler();
				}else if(methode.equals("getXMLArtiste")){
					gestionnaire = new ArtisteHandler();
				}else if(methode.equals("getXMLGenre")){
					gestionnaire = new GenreHandler();
				}else if(methode.equals("getXMLEditeur")){
					gestionnaire = new EditeurHandler();
				}else if(methode.equals("getXMLCategorie")){
					gestionnaire = new CategorieHandler();
				}
				parseur.parse(file, gestionnaire);
			}catch(SAXException e){
				System.out.println("sax erreur  : "+e);
			}
		}catch(Exception e){
			System.out.println("ERREUR 4");
			System.out.println("erreur RecupObjet : "+e);
		}
	}
	
}
